// cspell:disable
namespace mrs;

using System.Reflection;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

public class Program
{
    public static void Main(string[] args)
    {
        var builder = WebApplication.CreateBuilder(args);

        // Console.WriteLine("=== Console.WriteLine 输出 ===");

        // 添加系统服务支持, 支持 systemd 集成
        builder.Host.UseSystemd();

        // 添加 CORS 服务
        builder.Services.AddCors(options =>
        {
            options.AddPolicy("AllowAll", policy =>
            {
                policy.AllowAnyOrigin()    // 允许任何来源
                      .AllowAnyMethod()    // 允许任何 HTTP 方法
                      .AllowAnyHeader();   // 允许任何请求头
            });
        });

        // 添加服务
        builder.Services.AddControllers();  // 自动注册所有 Controller
        builder.Services.AddEndpointsApiExplorer();

        // builder.Services.AddSwaggerGen();
        builder.Services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo
            {
                Title = "Meteor Radar API",
                Version = "v1",
                Description = "气象雷达服务 API 文档 - 提供实时气象数据查询功能",  // 气象雷达服务 API 文档 - 提供实时气象数据查询功能
                Contact = new Microsoft.OpenApi.Models.OpenApiContact
                {
                    Name = "shenyongchen",
                    Email = "shenyczz@163.com"
                },
                License = new Microsoft.OpenApi.Models.OpenApiLicense
                {
                    Name = "MIT License",
                    Url = new Uri("https://opensource.org/licenses/MIT")
                }
            });

            // 设置 XML 注释文件路径
            var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
            var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);

            if (File.Exists(xmlPath))
            {
                c.IncludeXmlComments(xmlPath);
            }

        });

        // === test
        // var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
        // var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
        // Console.WriteLine($"--- xmlPath = {xmlPath}");

        // 注册配置服务 - 单例模式，整个应用共享同一个配置实例
        builder.Services.AddSingleton<IConfigService, ConfigService>();

        // 注册后台服务 - MeteorWorker
        // - MeteorWorker 会作为后台任务自动启动和运行
        // - 实现 IHostedService 接口，由 .NET 运行时管理生命周期
        // - 应用程序启动时自动调用 StartAsync
        // - 应用程序关闭时自动调用 StopAsync
        builder.Services.AddHostedService<MeteorWorker>();

        // Scoped - 作用域服务
        // 注册 Meteor 服务 - MeteorController 依赖 MeteorService 获取 MeteorData
        // - 每个 HTTP 请求范围内创建一个实例
        // - 同一个请求中的多个依赖使用同一个实例
        // - 请求结束时实例被销毁
        // - 不同请求使用不同的实例
        // - 使用 Scoped: 数据库上下文 (EF Core), e.g. ApplicationDbContext (DbContext 必须使用 Scoped - EF Core 要求)
        // - 使用 Scoped: 业务逻辑服务,  e.g. MeteorService, UserService
        // - 使用 Scoped: 需要维护请求状态的服务, e.g. ShoppingCartService
        // - 使用 Scoped: HTTP 请求相关的服务,  e.g. CurrentUserService
        builder.Services.AddScoped<IMeteorService, MeteorService>();

        // Transient - 瞬时服务
        // - 每次请求依赖时都创建一个新实例
        // - 即使在同一请求中，每次注入都是新实例
        // - 使用完后立即可以被垃圾回收
        // - 使用 Transient: 轻量级、无状态的服务, e.g. EmailService, ReportGenerator
        // - 使用 Transient: 计算服务、工具类, e.g. CalculatorService
        // - 使用 Transient: 每次都需要全新状态的服务, e.g. DataProcessor
        // builder.Services.AddTransient<IMeteorService, MeteorService>();

        // 构造应用
        var app = builder.Build();

        // 配置开发环境中间件
        // if (app.Environment.IsDevelopment())
        {
            app.UseSwagger();
            app.UseSwaggerUI(c =>
            {
                c.RoutePrefix = "swagger"; // 设置 Swagger UI 的访问路径, 可以设置自定义 e.g. api-docs
                c.DocumentTitle = "Meteor Radar API Documentation";
                c.SwaggerEndpoint("/swagger/v1/swagger.json", "Meteor Radar API v1");   // Select a definition
                c.DefaultModelsExpandDepth(2); // 控制模型显示深度
                c.DisplayRequestDuration();    // 显示请求持续时间
            });
        }

        // 自定义中间件
        // app.UseMiddleware<LoggingMiddleware>();

        app.UseRouting();
        app.UseCors("AllowAll");    // 应用 CORS 策略, (必须在 UseRouting 之后 UseAuthorization 之前)
        // app.UseAuthentication();    // 认证
        app.UseAuthorization();     // 授权

        // 端点映射
        app.MapControllers();

        // Minimal API 端点
        app.MapGet("/", () => Results.Json(new
        {
            author = "shenyongchen",
            message = "Meteor Worker Service with RESTfull API is running!",
            timestamp = DateTime.Now,
            version = "1.0.0",
            configPath = "system/config.json (internal use only)"
        })).ExcludeFromDescription(); // 从 Swagger 隐藏;

        // 注意：不暴露配置接口到外部
        // 内部配置只能通过依赖注入在服务内部访问

        // 应用生命周期事件
        app.Lifetime.ApplicationStarted.Register(() =>
        {
            var logger = app.Services.GetRequiredService<ILogger<Program>>();
            var configService = app.Services.GetRequiredService<IConfigService>();
            var config = configService.GetConfig();

            logger.LogInformation("Application started successfully at: {Time}", DateTime.UtcNow.ToString("yyyy-MM-dd hh:mm:ss.fff"));
            logger.LogInformation("Internal configuration loaded: DataRefreshInterval={Interval}, EnableDetailedLogging={Logging}",
                config.InternalServiceSettings.DataRefreshInterval,
                config.InternalServiceSettings.EnableDetailedLogging);
        });

        app.Lifetime.ApplicationStopping.Register(() =>
        {
            var logger = app.Services.GetRequiredService<ILogger<Program>>();
            logger.LogInformation("Application is shutting down ...");
        });

        app.Run();
    }

    // 
}
